﻿package com.medsys.dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import com.medsys.model.Atestado;
import com.medsys.model.Paciente;

/**
 * Classe respos�vel pela persistencia de dados da classe {@link Paciente}.
 * @author Felipe Lauksas
 *
 */
public class AtestadoDAO extends BaseDAO {
	/**
	 * Contrutor com parametro da sess�o j� iniciada
	 * @param session criada por {@link DAOFactory}.
	 */
	public AtestadoDAO(Session session) {
		super(session);		
	}	
	
	/**
	 * M�todo para salvar um objeto do tipo {@link Paciente} no banco de dados.
	 * @param paciente do tipo {@link Paciente}.
	 * @return {@link Paciente} persistido.
	 * @throws Exception
	 */
	public Atestado salvar (Atestado atestado) throws Exception{
		try {
			atestado = (Atestado) this.session.merge(atestado);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return atestado;
	}
	/**
	 * M�todo para alterar um objeto do tipo {@link Atestado} no banco de dados.
	 * @param atestado do tipo {@link Atestado}.
	 * @throws Exception
	 */
	public void alterar(Atestado atestado) throws Exception{
		try {
			this.session.update(atestado);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
	}
	/**
	 * M�todo para listar todos os objetos do tipo {@link Atestado} existentes no banco de dados.
	 * @return {@link List} com objetos {@link Atestado}.
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public List<Atestado> listarTodos() throws Exception{
		
		List<Atestado> listAtestados = null;
		
		try {
			
			listAtestados = this.session.createCriteria(Atestado.class).list();
			
		} catch (HibernateException e) {		
			
			throw new Exception(e);
		}
		return listAtestados;
	}
	
	/**
     * Pesquisa um atestado pela sua chave
     * @param Integer id
     * @return {@link Atestado} atestado
     */
    public Atestado pesquisarPorId(Serializable id)throws Exception{    
    	
    	Atestado atestado = null;
    	
    	try {
    		
			atestado = (Atestado) this.session.get(Atestado.class, id);
			
		} catch (HibernateException e) {	
			
			throw new Exception(e);
		}
		
        return atestado;
    }
    /**
     * Pesquisa um atestado pela sua chave
     * @param Integer id
     * @return {@link Atestado} atestado
     */
    public Atestado pesquisarPorIdCarregandoPaciente(Serializable id)throws Exception{    
    	
    	Atestado atestado = null;
    	
    	try {
    		Query q = this.session.createQuery("select a from Atestado a join fetch a.receituario where a.id = "+id);
			atestado = (Atestado) q.uniqueResult();
			
		} catch (HibernateException e) {	
			
			throw new Exception(e);
		}
		
        return atestado;
    }
}
